package xyz.bali16.module.netdisk.utils;

import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author bali2 on 1/11/2021.
 * @version 1.0
 */
public class FileUtil {
    /**
     * 生成文件独有的MD5 用来判断文件是否存在，去重文件
     *
     * @param multipartFile
     * @return
     */
    public static String generateFileMD5(MultipartFile multipartFile) {
        String md5 = null;
        InputStream is = null;
        try {
            if (multipartFile != null) {
                is = multipartFile.getInputStream();
            }
            md5 = DigestUtils.md5DigestAsHex(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return md5;
    }

    /**
     * 以 - Exist结尾来识别, 并重命名
     * a.jpg, a - Exist(1).jpg,a - Exist(2).jpg
     * 当文件名重复时候就要给后续文件一个不冲突的名字
     *
     * @param filename
     * @return
     */
    public static String renameExistFileName(String filename) {
        return MatchUtil.suffixIndexAdd(filename, " - Exist");
    }

    /**
     * 自动处理重名文件
     */
    public static String autoRenameExistFileName(List<String> filenames, String curName) {
        String lambdaCurName = curName;
        boolean fileNameExist = filenames.stream().anyMatch(s -> s.equals(lambdaCurName));
        if (fileNameExist) {
            System.out.println("当前文件名字已存在!"+curName);;
            curName = renameExistFileName(curName);
            autoRenameExistFileName(filenames, curName);
        }
        return curName;
    }

    /**
     * 正则验证文件名是否合法 [汉字,字符,数字,下划线,英文句号,横线]
     **/
    public static boolean verifyName(String filename) {
        final String format = "[^\\u4E00-\\u9FA5\\uF900-\\uFA2D\\w-_.]";
        Pattern pattern = Pattern.compile(format);
        Matcher matcher = pattern.matcher(filename);
        return !matcher.find();
    }


    /**
     * int 1:文本类型   2:图像类型  3:视频类型  4:音乐类型  5:其他类型 -1:文件夹
     **/
    public static int getFileType(String type) {
        if (".chm".equals(type) || ".txt".equals(type) || ".xmind".equals(type) || ".xlsx".equals(type) || ".md".equals(type)
                || ".doc".equals(type) || ".docx".equals(type) || ".pptx".equals(type)
                || ".wps".equals(type) || ".word".equals(type) || ".html".equals(type) || ".pdf".equals(type) || ".xls".equals(type) ) {
            return 1;
        } else if (".bmp".equals(type) || ".gif".equals(type) || ".jpg".equals(type) || ".ico".equals(type) || ".vsd".equals(type)
                || ".pic".equals(type) || ".png".equals(type) || ".jepg".equals(type) || ".jpeg".equals(type) || ".webp".equals(type)
                || ".svg".equals(type)) {
            return 2;
        } else if (".avi".equals(type) || ".mov".equals(type) || ".qt".equals(type)
                || ".asf".equals(type) || ".rm".equals(type) || ".navi".equals(type) || ".wav".equals(type)
                || ".mp4".equals(type) || ".mkv".equals(type) || ".webm".equals(type)) {
            return 3;
        } else if (".mp3".equals(type) || ".wma".equals(type)) {
            return 4;
        } else {
            return 5;
        }
    }

    /**
     * 转换文件大小
     *
     * @param size
     * @return
     */
    public static String parseSize(long size) {
        if (size < 1024) {
            return String.valueOf(size) + "B";
        } else {
            size = size / 1024;
        }
        if (size < 1024) {
            return String.valueOf(size) + "KB";
        } else {
            size = size / 1024;
        }
        if (size < 1024) {
            size = size * 100;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
        } else {
            size = size * 100 / 1024;
            return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
        }
    }
}
